/* 
    提炼函数 做法：
        1. 创建一个新函数，根据这个函数的意图来对它命名。 以它“做什么”来命名，而不是以它“怎么做”来命名。
        2. 将待提炼的代码从源函数复制到新建的目标函数中。
        3. 仔细检查提炼出的代码，看看其中是否引用了作用域限于源函数、在提炼出的新函数中访问不到的变量。若是，以参数的形式将它们传递给新函数。
        4.所有的变量都处理完之后，编译。
        5. 在源函数中，将被提炼代码段替换为目标函数的调用。
        6. 测试。
        7. 查看其它代码是否有被提炼的代码段相同或相似之处。如果有，考虑用【函数调用取代内联代码】令其调用提炼出的新函数。

    范例：无局部变量
*/

function printOwing(invoice) {
    let outstanding = 0;
    printBanner();

    // calculate outstanding
    for (const o of invoice.orders) {
        outstanding += o.amount;
    }

    // record due date
    const today = Clock.today;
    invoice.dueDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 30);

    // print details
    printDetail();

    /******************************************************************************************** */

    function printBanner() {
        console.log('*******************************');
        console.log('******** Customer Owes*********');
        console.log('*******************************');
    }

    function printDetail() {
        console.log('name:' + invoice.customer);
        console.log('amount:' + outstanding);
        console.log('due:' + invoice.dueDate.toLocalDateString());
    }
}